_init: function() {
      var host = window.document.location.host;
      this.ws = new WebSocket('ws://'+host+'/ws?id=' + this.props.app.id+'&uid='+this.user._id);
      this.ws.onmessage = this.onmessage.bind(this);

      this.ws.onclose = function() {
        return null;
        console.info('WsClient 关闭....');
        this.intervalId = setInterval(function() {
          // this.ws.Reconnect();
          //console.info("WsClient 尝试重连");
        }.bind(this), 5000)
      }.bind(this);

      this.ws.onopen = function() {
        if (this.intervalId) {
          clearInterval(this.intervalId);
          this.intervalId = 0;
        }
        // 发送登录
        this.send({operate: "login"});
      }.bind(this);

      this.ws.onerror = function(err) {
        console.error(err);
      }
    },
    render: function() {
      return null;
    },
    onmessage: function(event) {
      var data = event.data;
      if (!data)
        return ;
      data = JSON.parse(data);
      switch(data.operate){
        case "setcookie":
          setCookie(data.key, data.value, 24*60);
          break;
        case "close":
          var _temp = _.findWhere(this.listData.items, {page_id: data.page_id, user_id: data.user_id});
          if (_temp) {
            // 删除 this.listData.items 数据逻辑
            var _index= _.findIndex(this.listData.items,{page_id: data.page_id, user_id: data.user_id});
            this.listData.items.splice(_index,1);

            if (data.page_id == this.state.page_id && _temp.operate == "lock") {
              this._update({WsShadow: false});
            }
          }
          break;
        case "look":
        case "lock":
          // 修改 this.listData.items 数据逻辑
          var _temp = _.findWhere(this.listData.items, {page_id: data.page_id, user_id: data.user_id});
          if (_temp){
             _temp.operate = data.operate;
          } else {
            this.listData.items.push(data);
          }

          var isLock= data.operate == "lock",
          isCurrPage= this.state.page_id == data.page_id;

          //更新界面状态是否锁定
          var _state= {WsUserName: data.userName}
          _state.WsShadow= isLock && isCurrPage;
          this._update(_state);

          //收到解锁，model数据
          if(!isLock) {
            var _page = this.props.app.pages.findWhere({id: data.page_id});
            if (!_page) {
              return console.log("协同收到页面解锁，更新页面时没找到页面。");
            }
            _page.fetch({success: function(){
              // this.operate != "lock" 别人切换到当前页面时，而我正在操作
              this.operate != "lock" && isCurrPage && Backbone.trigger("configure:page");
            }.bind(this)});
          }
          break;
        case "unlock":
          this.operate = "look"
          var _page = this.props.app.pages.findWhere({id: data.page_id});
          _page.fetch({success: function(){
            this._update({WsShadow: true, WsUserName: data.userName, operate: "look"});
            //Backbone.trigger("configure:page");
          }.bind(this)});
          break;
        case "list":
          this.listData = data;
          this.checkPageStateSend();
          break;
      }
    },
    send: function(data) {
      if (!this.ws) return; // websocket did not initialized yet? return
      this.ws.readyState == this.ws.OPEN && this.ws.send(JSON.stringify(data));
    }